package cn.edu.swu.miniwebsvr.core;

import cn.edu.swu.miniwebsvr.handler.DefaultHandler;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

//请求路由分发器。
//根据Parameter中的URL查找 Config 中对应的 Handler 对象，并调用其 handle 方法。
public class Router {

    /**
     * 路由请求到对应的处理器
     * @param request 解析后的请求参数对象（包含URL、方法、参数等信息）
     * @param response 用于向客户端发送响应的输出流
     */
    public void route(Parameter request, OutputStream response) {
        Config config = Config.getInstance();

        // TODO: [学号/姓名] 根据请求的URL获取Handler
        // 根据请求的URL从配置中查找对应的处理器（Handler）
        Handler handler = config.getHandler(request.getUrl());

        if (handler == null) {
            // 如果没有匹配的路由，使用 DefaultHandler 处理
            handler = config.getHandler("/");
        }

        if (handler != null) {
            handler.handle(request, response);
        } else {
            // TODO: [学号/姓名] 如果连DefaultHandler都没有，返回500 Internal Server Error
            // 若既没有匹配的处理器，也没有默认处理器（根路径处理器），返回500服务器内部错误
            try {
                // 构造500错误的HTML响应体
                String errorHtml = "<html>" +
                        "<head><title>500 Internal Server Error</title></head>" +
                        "<body>" +
                        "<h1>500 Internal Server Error</h1>" +
                        "<p>服务器配置错误：未找到默认处理器</p>" +
                        "</body></html>";

                // 构造符合HTTP协议的响应报文（状态行+响应头+空行+响应体）
                String httpResponse = "HTTP/1.1 500 Internal Server Error\r\n" +
                        "Content-Type: text/html; charset=UTF-8\r\n" +
                        "Content-Length: " + errorHtml.getBytes("UTF-8").length + "\r\n" +
                        "Connection: close\r\n" +
                        "\r\n" +
                        errorHtml;

                // 写入响应并刷新输出流
                response.write(httpResponse.getBytes("UTF-8"));
                response.flush();
            } catch (IOException e) {
                // 捕获响应写入时的IO异常（如客户端断开连接）
                System.err.println("发送500错误响应失败: " + e.getMessage());

            }
        }
    }
}